package be.khl.kevinvranken.breekuit.entiteiten;

import be.khl.kevinvranken.breekuit.*;
import be.khl.kevinvranken.breekuit.entiteiten.upgrades.*;
import java.util.Random;

/**
 * Een bal die blokken kan raken
 * 
 * @author Kevin Vranken
 */
public class Bal extends Entiteit {

    private Spel game;
    private Blok laatstegeraakteBlok; //Een Blok niet dubbel "doden"
    private boolean paddleGeraakt; // Dubbele bots vermijden

    public Bal(Spel game, String sprite, int x, int y) {
        super(sprite, x, y);
        //Bal een random snelheid toekennen
        this.game = game;

        Random rn = new Random();
        int horizontaal = rn.nextInt(275);//verticale snelheid tussen 0 en 274
        if (Math.random() < .50) { //50% kans links of rechts
            horizontaal *= -1;
        }

        dy = (rn.nextInt((350 - 250 + 1)) + 250) * -1;//verticale snelheid tussen -250 en -350
        dx = horizontaal;

        paddleGeraakt=false;
        laatstegeraakteBlok=null;
    }

    @Override
    public void move(long delta) {
        super.move(delta);

        if (y < 15) {
            setVerticalMovement(getVerticalMovement() * -1);
            paddleGeraakt = false;
        }

        if (x < 10 || x > 775) {
            setHorizontalMovement(getHorizontalMovement() * -1);
            paddleGeraakt = false;
        }

        if (y < -100 || y > 800) {
            game.removeEntity(this);
            game.behandelVerliesBal();
        }
    }

    public void collidedWith(Entiteit entiteit) {

        if (entiteit instanceof Paddle && !paddleGeraakt) { //tegen upgrades en ballen moeten we niet botsen
            berekenAfwijking(entiteit);
            paddleGeraakt = true;
        }

        if (entiteit instanceof Blok && ((Blok) (entiteit)) != laatstegeraakteBlok) {
            game.removeEntity(entiteit);
            game.behandelVerliesBlok();
            setVerticalMovement(getVerticalMovement() * -1);
            laatstegeraakteBlok = (Blok) entiteit;
            paddleGeraakt = false;
        }

        if (entiteit instanceof LijnEntiteit) {
            setVerticalMovement(getVerticalMovement() * -1);
        }
    }

    /**
     * Bepalen naar waar een bal bliegt na in aanraking te komen met de paddle
     * (Dit heeft verschrikkelijk lang geduurd voor ik dit juist kreeg :P)
     * @param entiteit
     */
    private void berekenAfwijking(Entiteit entiteit) {
        double afwijking;
        double centrumEntiteit = entiteit.x + (entiteit.getBreedte() / 2);
        afwijking = Math.abs(centrumEntiteit - (x + (getBreedte() / 2))); // 0 = midden

        if (centrumEntiteit - (x + (getBreedte() / 2)) > 0) {
            afwijking = afwijking * -1;
        }

        setHorizontalMovement(afwijking * 2.5);
        setVerticalMovement(getVerticalMovement() * -1);
        setVerticalMovement(getVerticalMovement() * 1.01); // elke keer 1% sneller

    }
}